// 主要是扫描 html里的html,然后将扫描后的结果返回
// 比如 你好,{{name}}.   
// 拆解为: 你好,      name 两块内容

export default  class Scanner { 
    constructor(templateStr) {
        this.templateStr = templateStr;
        this.pos = 0; // 开始的指针开始的点
        this.tail = templateStr; // 初始化尾巴就是 模板字符串整体
        // this.line = 1;
        // this.col = 0;
    }
    
    scan(stopTag){ // 扫描 小胡子语法,小胡子的左右两个都会扫描到. 
        
        // scan 没有返回值.
        let haveStop = this.tail.indexOf(stopTag) ; // 计算当前尾巴字符串中,是否包含停止标识.
        if(haveStop== 0){ // 如果结尾的左侧,是停止标识.
            // 需要将pos 定位点 往右侧挪动 停止符个数的位置
            this.pos += stopTag.length;
            this.tail = this.templateStr.substring(this.pos); // 重新计算尾巴字符串
        }
        
    }
    scanUtil(stopTag){ // 开始扫描,遇到 固定值或者变量值
        this.stopTag = stopTag;
        const post_backup = this.pos; // 记录没循环之前的定位,
        while(!this.eos() && this.tail.indexOf(stopTag) != 0 ){  // 必须加个拦截，不然会触发死循环。
            // indexOf 是首次出现的索引,如果不是0,就说明不是尾巴字符串的最左侧. 就继续++
            // 理解: 就是出现一个结束字符串, 比如}} 就可以跳出做一些其他逻辑.
            this.pos++; // 每次移动一次指针
            this.tail = this.templateStr.substring(this.pos) // 每次从移动后的指针 往右侧计算尾巴.
        }
        return this.templateStr.substring(post_backup, this.pos); // 从初始位置, 到结束后的位置.
        
    }

    // eos = end of string ，判断字符串是否已经到达结束点。
    eos(){ 
        // 判断 定位点，是否小于总长度，就可以继续执行。 否则就要返回false，打断循环。
       return this.pos >= this.templateStr.length; // 判断指针是否到头
    }
}